﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CCL.SocketMessage;
using CCL.Utility;

namespace CCL.TableStructure
{
    /// <summary>
    /// 직렬화 가능한 FileHeader Table을 제공합니다.
    /// </summary>
    public class FileHeader : Table, ISerializable
    {
        /// <summary>
        /// 파일 이름을 가져옵니다.
        /// </summary>
        public char[] FileName { get; private set; }

        /// <summary>
        /// 파일 크기를 가져옵니다.
        /// </summary>
        public long FileSize { get; private set; }

        /// <summary>
        /// 해당 Table의 총 Size
        /// </summary>
        public new const int TableSize =
            Constant.Length.FileName +
            sizeof(long);

        /// <summary>
        /// 새로운 FileHeader를 생성합니다.
        /// </summary>
        public FileHeader(string fileName, long fileSize)
        {
            FileName = StringUtility.StringCopy(fileName, Constant.Length.FileName);
            FileSize = fileSize;
        }

        /// <summary>
        /// 바이트 배열로 직렬화 합니다.
        /// </summary>
        /// <returns>직렬화된 바이트 배열</returns>
        public byte[] GetByte()
        {
            byte[] bytes = new byte[GetSize()];

            int start = 0;
            byte[] temp;

            temp = Encoding.Default.GetBytes(FileName);
            Array.Copy(temp, 0, bytes, start, Constant.Length.FileName);
            start += Constant.Length.FileName;

            temp = BitConverter.GetBytes(FileSize);
            Array.Copy(temp, 0, bytes, start, temp.Length);

            return bytes;
        }

        /// <summary>
        /// 직렬화 가능한 객체의 바이트 사이즈를 가져옵니다.
        /// </summary>
        /// <returns>직렬화된 바이트 사이즈</returns>
        public uint GetSize()
        {
            return TableSize;
        }
    }
}
